Houdiniメモ : VEX : 二つのベクトルがなす角の計算
内積を利用した角度の計算
内積の大きさは以下のようになります。 $ (0 \leqq \theta \leqq \pi)
$ \vec{a} \cdot \vec{b} = |a| |b| cos \theta
ベクトルa, bの長さが1の場合は以下のようになります。
$ \vec{a} \cdot \vec{b} = cos \theta
$ \theta を求める計算式は以下のようになります。(ベクトルa, bの長さが1の場合)
$ \theta = acos( \vec{a} \cdot \vec{b} )
VEXで実装すると以下のようになります。
code:VEX1(c)
vector a = {1, 2, 3};
vector b = {5, 6, 7};
a = normalize(a); // 長さを1にする
b = normalize(b); // 長さを1にする
// ベクトルAとベクトルBがなす角度を求める
f@Angle_Dot = acos(dot(a, b));
■使用例
https://gyazo.com/2e2cefe84027677e76514b87c36149db https://gyazo.com/c88290d924aca49fee383687a78d5a7a
計算結果は0.252345になりました。
外積を利用した角度の計算
外積の大きさは以下のようになります。 $ (0 \leqq \theta \leqq \pi)
$ |\vec{a} \times \vec{b}| = |\vec{a}| |\vec{b}| sin \theta
ベクトルa, bの長さが1の場合は以下のようになります。
$ |\vec{a} \times \vec{b}| = sin \theta
$ \theta を求める計算式は以下のようになります。(ベクトルa, bの長さが1の場合)
$ \theta = asin( |\vec{a} \times \vec{b}| )
VEXで実装すると以下のようになります。
code:VEX2(c)
vector a = {1, 2, 3};
vector b = {5, 6, 7};
a = normalize(a); // 長さを1にする
b = normalize(b); // 長さを1にする
// ベクトルAとベクトルBがなす角度を求める
f@Angle_Cross = asin(length(cross(a, b))); // 外積から角度を求める
■使用例
https://gyazo.com/6993218b564563102b1213079c287e4a
https://gyazo.com/4adca7616e1f4b6a5fba163505667e60
計算結果は先ほどと同じく、0.252345になりました。
参考
Dot product(内積)